home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 426-450 / disk_438 / gadgeted / source / pref.c < prev    next >
C/C++ Source or Header  |  1992-05-06  |  11KB  |  372 lines

  1. /*----------------------------------------------------------------------*
  2.    pref.c Version 2.0 - © Copyright 1990 Jaba Development
  3.  
  4.    Author  : Jan van den Baard
  5.    Purpose : the preferences requester
  6.  *----------------------------------------------------------------------*/
  7.  
  8. static UBYTE UNDOBUFFER[80];
  9.  
  10. static SHORT MainPairs2[] =
  11.  { 0,0,296,0,296,85,0,85,0,0
  12.  };
  13. static struct Border MainBorder2 =
  14.  { 2,1,0,0,JAM1,5,MainPairs2,NULL
  15.  };
  16. static SHORT MainPairs1[] =
  17.  { 0,0,296,0
  18.  };
  19. static struct Border MainBorder1 =
  20.  { 2,12,0,0,JAM1,2,MainPairs1,&MainBorder2
  21.  };
  22.  
  23. static SHORT SUPairs[] =
  24.  { 0,0,87,0,87,13,0,13,0,0
  25.  };
  26. static struct Border SUBorder =
  27.  { -1,-1,0,0,JAM1,5,SUPairs,NULL
  28.  };
  29.  
  30. static struct IntuiText SUText =
  31.  { 0,0,JAM1,3,2,NULL,(UBYTE *)"Save & Use",NULL
  32.  };
  33. static struct Gadget SU =
  34.  { NULL,203,71,86,12,NULL,RELVERIFY,BOOLGADGET,
  35.    (APTR)&SUBorder,NULL,&SUText,NULL,NULL,9,NULL
  36.  };
  37.  
  38. static struct IntuiText USText =
  39.  { 0,0,JAM1,33,2,NULL,(UBYTE *)"Use",NULL
  40.  };
  41. static struct Gadget US =
  42.  { &SU,107,71,86,12,NULL,RELVERIFY,BOOLGADGET,
  43.    (APTR)&SUBorder,NULL,&USText,NULL,NULL,8,NULL
  44.  };
  45.  
  46. static struct IntuiText SAText =
  47.  { 0,0,JAM1,27,2,NULL,(UBYTE *)"Save",NULL
  48.  };
  49. static struct Gadget SA =
  50.  { &US,12,71,86,12,NULL,RELVERIFY,BOOLGADGET,
  51.    (APTR)&SUBorder,NULL,&SAText,NULL,NULL,7,NULL
  52.  };
  53.  
  54. static SHORT RWPairs[] =
  55.  { 0,0,136,0,136,10,0,10,0,0
  56.  };
  57. static struct Border RWBorder =
  58.  { -1,-1,0,0,JAM1,5,RWPairs,NULL
  59.  };
  60.  
  61. static struct IntuiText REText =
  62.  { 0,0,JAM1,30,1,NULL,(UBYTE *)"REQUESTER",NULL
  63.  };
  64. static struct Gadget RE =
  65.  { &SA,155,57,135,9,NULL,GADGIMMEDIATE+TOGGLESELECT,BOOLGADGET,
  66.    (APTR)&RWBorder,NULL,&REText,1L,NULL,3,NULL
  67.  };
  68.  
  69. static struct IntuiText WDText =
  70.  { 0,0,JAM1,43,1,NULL,(UBYTE *)"WINDOW",NULL
  71.  };
  72. static struct Gadget WD =
  73.  { &RE,12,57,135,9,NULL,GADGIMMEDIATE+TOGGLESELECT,BOOLGADGET,
  74.    (APTR)&RWBorder,NULL,&WDText,2L,NULL,2,NULL
  75.  };
  76.  
  77. static SHORT OPPairs[] =
  78.  { 0,0,279,0,279,11,0,11,0,0
  79.  };
  80. static struct Border OPBorder =
  81.  { -1,-1,0,0,JAM1,5,OPPairs,NULL
  82.  };
  83.  
  84. static struct IntuiText ICText =
  85.  { 0,0,JAM1,99,1,NULL,(UBYTE *)"Image Copy",NULL
  86.  };
  87. static struct Gadget IC =
  88.  { &WD,12,43,278,10,NULL,GADGIMMEDIATE+TOGGLESELECT,BOOLGADGET,
  89.    (APTR)&OPBorder,NULL,&ICText,NULL,NULL,1,NULL
  90.  };
  91.  
  92. static struct IntuiText AUSText =
  93.  { 0,0,JAM1,40,1,NULL,(UBYTE *)"Auto Gadget -> Image size",NULL
  94.  };
  95. static struct Gadget AUS =
  96.  { &IC,12,29,278,10,NULL,GADGIMMEDIATE+TOGGLESELECT,BOOLGADGET,
  97.    (APTR)&OPBorder,NULL,&AUSText,1,NULL,0,NULL
  98.  };
  99.  
  100. static struct IntuiText SZPText =
  101.  { 0,0,JAM1,58,1,NULL,(UBYTE *)"Skip zero bit-planes",NULL
  102.  };
  103. static struct Gadget SZP =
  104.  { &AUS,12,15,278,10,NULL,GADGIMMEDIATE+TOGGLESELECT,BOOLGADGET,
  105.    (APTR)&OPBorder,NULL,&SZPText,NULL,NULL,0,NULL
  106.  };
  107.  
  108. static struct IntuiText MainText =
  109.  { 0,0,JAM1,107,3,NULL,(UBYTE *)"Preferences",NULL
  110.  };
  111.  
  112. static struct NewWindow pr_req =
  113.  { 10,15,301,88,0,1,GADGETUP+GADGETDOWN,
  114.    NOCAREREFRESH+SMART_REFRESH+ACTIVATE+RMBTRAP,
  115.    NULL,NULL,NULL,NULL,NULL,0,0,0,0,CUSTOMSCREEN
  116.  };
  117.  
  118. extern struct Window     *MainWindow;
  119. extern struct Screen     *MainScreen;
  120. extern BOOL               REQUESTER;
  121. extern struct ge_prefs    prefs;
  122. extern ULONG              Class;
  123. extern USHORT             GadgetCount, BackFill, BackPen, FrontPen;
  124. extern struct Gadget     *Gadget;
  125. extern struct RastPort   *MainRP;
  126. extern struct NewWindow   nw_main;
  127. extern struct GadgetList  Gadgets;
  128. extern UBYTE              wdt[80],wlb[MAXLABEL];
  129. extern ULONG              WindowFlags;
  130. extern struct Gadget      TextGadget;
  131.  
  132. static struct Window *pw;
  133.  
  134. /*
  135.  * write the preferences to "DEVS:GadgetEd.PREFS"
  136.  */
  137. static BOOL save_prefs()
  138. {
  139.     BPTR file;
  140.     BOOL ret = TRUE;
  141.  
  142.     if(NOT(file = Open("DEVS:GadgetEd.PREFS",MODE_NEWFILE))) return(FALSE);
  143.  
  144.     if(Write(file,(char *)&prefs,sizeof(struct ge_prefs)) == -1) ret = FALSE;
  145.     Close(file);
  146.  
  147.     return(ret);
  148. }
  149.  
  150. /*
  151.  * set the preferences
  152.  */
  153. static VOID set_prefs()
  154. {
  155.     if(SelectTest(&SZP))  prefs.skip_zero_planes = TRUE;
  156.     else                  prefs.skip_zero_planes = FALSE;
  157.     if(SelectTest(&AUS))  prefs.auto_size        = TRUE;
  158.     else                  prefs.auto_size = FALSE;
  159.     if(SelectTest(&IC))   prefs.image_copy = TRUE;
  160.     else                  prefs.image_copy = FALSE;
  161.     if(SelectTest(&RE)) { REQUESTER = TRUE; BackFill = BackPen; }
  162.     else                  REQUESTER = FALSE;
  163.     refresh();
  164. }
  165.  
  166. #define REQ WINDOWDRAG+WINDOWSIZING+SIZEBRIGHT+SIZEBBOTTOM+GIMMEZEROZERO+BORDERLESS;
  167.  
  168. /*
  169.  * re arrange the gadget list
  170.  */
  171. struct Gadget *re_arrange()
  172. {
  173.     register struct MyGadget *g;
  174.     register struct Gadget *gd;
  175.  
  176.     if(Gadgets.TailPred == (struct MyGadget *)&Gadgets) return(NULL);
  177.  
  178.     for(g = Gadgets.TailPred; g != (struct MyGadget *)&Gadgets; g = g->Pred)
  179.     {   gd = &g->Gadget;
  180.         if(g->Pred == (struct MyGadget *)&Gadgets) gd->NextGadget = NULL;
  181.         else gd->NextGadget = &g->Pred->Gadget;
  182.     }
  183.     return(&Gadgets.TailPred->Gadget);
  184. }
  185.  
  186. /*
  187.  * change the window to requester or viceversa
  188.  */
  189. BOOL change_window()
  190. {
  191.     register struct Gadget    *g, *g1, *gl;
  192.     register struct IntuiText *t;
  193.     struct Window             *w;
  194.  
  195.     nw_main.LeftEdge       =   MainWindow->LeftEdge;
  196.     nw_main.TopEdge        =   MainWindow->TopEdge;
  197.     nw_main.Width          =   MainWindow->Width;
  198.     nw_main.Height         =   MainWindow->Height;
  199.     nw_main.Flags          =   NULL;
  200.     nw_main.FirstGadget    =   NULL;
  201.     nw_main.Screen         =   MainScreen;
  202.     nw_main.MinWidth       =   MainWindow->MinWidth;
  203.     nw_main.MinHeight      =   MainWindow->MinHeight;
  204.     nw_main.MaxWidth       =   MainScreen->Width;
  205.     nw_main.MaxHeight      =   MainScreen->Height;
  206.  
  207.     add_bo();
  208.  
  209.     g = gl = re_arrange();
  210.  
  211.     if(REQUESTER)
  212.     {   nw_main.DetailPen    =   0;
  213.         nw_main.BlockPen     =   1;
  214.         BackFill             =   1;
  215.         FrontPen             =   0;
  216.         BackPen              =   1;
  217.         nw_main.Flags        =   REQ;
  218.         strcpy((char *)&wlb,"requester");
  219.         strcpy((char *)&wdt,"Requester");
  220.         nw_main.Title        =   (UBYTE *)"Work Requester";
  221.         if((nw_main.LeftEdge + nw_main.Width + 17) < MainScreen->Width)
  222.             nw_main.Width += 17;
  223.         if((nw_main.TopEdge + nw_main.Height + 8) < MainScreen->Height)
  224.             nw_main.Height += 8;
  225.     }
  226.     else
  227.     {   nw_main.DetailPen    =   MainWindow->DetailPen;
  228.         nw_main.BlockPen     =   MainWindow->BlockPen;
  229.         strcpy((char *)&wdt,"Work Window");
  230.         nw_main.Title        =   (UBYTE *)&wdt;
  231.         strcpy((char *)&wlb,"new_window");
  232.         FrontPen             =   1;
  233.         BackPen              =   0;
  234.         nw_main.Width       -=   17;
  235.         nw_main.Height      -=   8;
  236.         if(TestBits(WindowFlags,WINDOWCLOSE))  nw_main.Flags |= WINDOWCLOSE;
  237.         if(TestBits(WindowFlags,WINDOWDRAG))   nw_main.Flags |= WINDOWDRAG;
  238.         if(TestBits(WindowFlags,WINDOWDEPTH))  nw_main.Flags |= WINDOWDEPTH;
  239.         if(TestBits(WindowFlags,WINDOWSIZING)) nw_main.Flags |= WINDOWSIZING;
  240.         if(TestBits(WindowFlags,SIZEBRIGHT))   nw_main.Flags |= SIZEBRIGHT;
  241.         if(TestBits(WindowFlags,SIZEBBOTTOM))  nw_main.Flags |= SIZEBBOTTOM;
  242.     }
  243.     nw_main.Flags |= NOCAREREFRESH+SMART_REFRESH+ACTIVATE;
  244.  
  245.     if(NOT(w = OpenWindow(&nw_main)))
  246.     {   Error("Can't change window !");
  247.         if(g) AddGList(MainWindow,g,-1L,GadgetCount,NULL);
  248.         return;
  249.     }
  250.  
  251.     if(REQUESTER)
  252.     {  if(g)
  253.        {   while(1)
  254.            {   g1 = g->NextGadget;
  255.                un_grel(MainWindow,g);
  256.                if(TestBits((ULONG)g->Flags,GRELWIDTH))  g->Flags ^= GRELWIDTH;
  257.                if(TestBits((ULONG)g->Flags,GRELHEIGHT)) g->Flags ^= GRELHEIGHT;
  258.                if(TestBits((ULONG)g->Flags,GRELRIGHT))  g->Flags ^= GRELRIGHT;
  259.                if(TestBits((ULONG)g->Flags,GRELBOTTOM)) g->Flags ^= GRELBOTTOM;
  260.  
  261.                if(TestBits((ULONG)g->Activation,RIGHTBORDER))
  262.                     g->Activation ^= RIGHTBORDER;
  263.                if(TestBits((ULONG)g->Activation,LEFTBORDER))
  264.                     g->Activation ^= LEFTBORDER;
  265.                if(TestBits((ULONG)g->Activation,TOPBORDER))
  266.                     g->Activation ^= TOPBORDER;
  267.                if(TestBits((ULONG)g->Activation,BOTTOMBORDER))
  268.                     g->Activation ^= BOTTOMBORDER;
  269.  
  270.                g->TopEdge  -= MainWindow->BorderTop - 1;
  271.  
  272.                if(NOT g1) break;
  273.                g = g1;
  274.            }
  275.        }
  276.        if((t = TextGadget.GadgetText))
  277.        {   while(1)
  278.            {   t->TopEdge -= MainWindow->BorderTop - 1;
  279.                if(NOT(t = t->NextText)) break;
  280.            }
  281.        }
  282.     }
  283.     else
  284.     {   if(g)
  285.         {   while(1)
  286.             {   g1 = g->NextGadget;
  287.                 if(TestBits((ULONG)g->Activation,ENDGADGET))
  288.                 g->Activation ^= ENDGADGET;
  289.                 g->TopEdge  += MainWindow->BorderTop + 1;
  290.                 if(NOT g1) break;
  291.                 g = g1;
  292.             }
  293.         }
  294.         if((t = TextGadget.GadgetText))
  295.         {   while(1)
  296.             {   t->TopEdge += MainWindow->BorderTop + 1;
  297.                 if(NOT(t = t->NextText)) break;
  298.             }
  299.         }
  300.     }
  301.  
  302.     ClearMenuStrip(MainWindow);
  303.     CloseWindow(MainWindow);
  304.     MainWindow = w;
  305.     MainRP     = MainWindow->RPort;
  306.     SetMenu(MainWindow);
  307.     if(gl) AddGList(MainWindow,gl,-1L,GadgetCount,NULL);
  308.     rem_bo();
  309.     refresh();
  310. }
  311.  
  312. /*
  313.  * open the preferences window
  314.  */
  315. VOID preferences()
  316. {
  317.     struct RastPort *rp;
  318.     BOOL             running = TRUE, req;
  319.     USHORT           g_id;
  320.  
  321.     pr_req.Screen = MainScreen;
  322.     if(NOT(pw = OpenWindow(&pr_req))) return;
  323.     disable_window();
  324.     rp = pw->RPort;
  325.     draw(pw,&SZP,&MainBorder1,&MainText);
  326.     DeSelectGList(pw,&SZP,NULL,5);
  327.     if(prefs.skip_zero_planes) SelectGadget(pw,&SZP,NULL);
  328.     if(prefs.auto_size) SelectGadget(pw,&AUS,NULL);
  329.     if(prefs.image_copy) SelectGadget(pw,&IC,NULL);
  330.     if(REQUESTER) SelectGadget(pw,&RE,NULL);
  331.     else SelectGadget(pw,&WD,NULL);
  332.     req = REQUESTER;
  333.     do
  334.     {   Wait(1 << pw->UserPort->mp_SigBit);
  335.         while(read_msg(pw))
  336.         {   g_id = Gadget->GadgetID;
  337.             switch(g_id)
  338.             {   case 2:
  339.                 case 3: MutualExclude(pw,Gadget,&WD,NULL);
  340.                         SelectGadget(pw,Gadget,NULL);
  341.                         break;
  342.                 case 7:
  343.                 case 8:
  344.                 case 9: running = FALSE;
  345.                         break;
  346.             }
  347.         }
  348.     } while(running == TRUE);
  349.     CloseWindow(pw);
  350.     enable_window();
  351.     if(g_id == 7)
  352.     {    if(NOT save_prefs())
  353.          {   Error("Error writing preferences !");
  354.              return;
  355.          }
  356.     }
  357.     else if(g_id == 8)
  358.     {   set_prefs();
  359.         if(REQUESTER != req) change_window();
  360.         set_extra_items(MainWindow);
  361.     }
  362.     else
  363.     {   set_prefs();
  364.         if(REQUESTER != req) change_window();
  365.         set_extra_items(MainWindow);
  366.         if(NOT save_prefs())
  367.         {   Error("Error writing preferences !");
  368.             return;
  369.         }
  370.     }
  371. }
  372.